/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package validadores;

import javax.swing.JComponent;

/**
 *Esta interfaz permitira establecer el comportamiento general de los validadores de
 * componentes graficos, deberan implementarlo todos los componentes graficos en el paquete
 * validadores.api
 * @author Steve
 */
public interface ValidadorComponent {

    /**
     * Enumeacion que encapsula los momentos en que se desea validar el control
     */
    enum ValidarEn {

        /**
         * El control no se valida automaticamente bajo un evento, deberá validarse mediante<br>
         * el metodo <code>validar</code>
         */
        MANUAL,
        /**
         * El control se valida al perder el foco
         */
        ON_FOCUS_LOST,
        /**
         * El control se valida al cambiar su contenido
         */
        ON_CHANGE,
        /**
         * El control se valida al cambiar su contenido y al perder el foco
         */
        ON_CHANGE_AND_ON_FOCUS_LOST
    }

    /**
     * Enumeracion que encapsula las direcciones a los iconos que se utilizaran
     * en los validadores
     */
    enum IconoValidador {

        /**
         * Este icono se mostrara como una ayuda al usuario para el campo
         */
        SUGERENCIA("/validadores/info 22x22.png"),
        /**
         * Este icono sera para mostrar un error cuando el campo este vacio
         */
        ERROR_VACIO("/validadores/error 22x22.png"),
        /**
         * Este icono se mostrara cuando exista un error de formato
         */
        ERROR_FORMATO("/validadores/important 22x22.png"),
        /**
         * Este icono se mostrara cuando el campo sea valido
         */
        OK("/validadores/ok 22x22.png");

        private IconoValidador(String name) {
            this.name = name;
        }
        private final String name;

        @Override
        public String toString() {
            return name;
        }
    }

    /**
     * Devuelve el control swing que se esta validando
     * @return
     */
    public JComponent getComponenteAValidar();

    /**
     * Establece que control debe validarse
     * @param componente
     */
    public void setComponenteAValidar(JComponent componente);

    /**
     * Permite obtener el validador de formato que se esta utilizando 
     * @return
     */
    public ValidadorFormato getValidadorFormato();

    /**
     * Permite establecer el  que se utilizara para validar este control
     * @param validador
     */
    public void setValidadorFormato(ValidadorFormato validador);

    /**
     * Este metodo permitira verificar si la validacion de este componente es obligatoria
     * @return <b>true</b> si la validacion del componente es obligatoria, <b>false</b> si no lo es
     */
    public boolean isObligatorio();

    /**
     * Este metodo permitira establecer la obligatoriedad de la validacion de este componente
     * @param obligatorio recibe true si la validacion es obligatoria, false si no lo es
     */
    public void setObligatorio(boolean obligatorio);

    /**
     * Permite obtener el mensaje de error en caso de que el campo sea obligatorio y este vacio
     * @return
     */
    public String getMensajeError();
    /**
     * Permite establecer el mensaje de error que se mostrara si el campo es obligatorio
     * y esta vacio
     * @param mensaje
     */
    public void setMensajeError(String mensaje);
    /**
     * Determina en que momento debera validarse el control
     * @return 
     */
    public ValidarEn getValidarEn();

    /**
     * Establece en que momento debera validarse el control
     * @param validaren elemento de la enumeracion ValidarEn de esta clase
     */
    public void setValidarEn(ValidarEn validaren);

    /**
     * Este metodo permite determinar si el control es valido o no
     * @return
     */
    public boolean isValido();

    /**
     * Establece si el control es valido o no, este metodo deberia establecerse con el valor
     * que retorne el metodo validar
     * @param valido
     */
    public void setValido(boolean valido);

    /**
     * Este metodo permite validar de forma manual el control
     * @return
     */
    public boolean validar();
}
